# 购物车合并的逻辑   从coookie中合并到redis中
import base64


import pickle

from django.shortcuts import redirect
from django_redis import get_redis_connection


def merge_cart_cookie_to_redis(request,user,response):
    # 前端：cookie数据在请求过程中会自动携带
    # 后端：在用户登录的时候，将携带过来的cookie数据合并到redis中
    # 1.获取cooike信息中的carts数据，并进行解码  若没有，则不需要合并
    cookie_str = request.COOKIES.get('carts')
    # 如果cookie中有数据就相应结果
    if cookie_str is not None:
        # 把cookie数据进行解码处理 然后在转成字典
        carts = pickle.loads(base64.b64decode(cookie_str))

        # 2.读取redis数据
        redis_conn = get_redis_connection('carts')
        sku_id_counts = redis_conn.hgetall('carts_%s'%user.id)


        redis_hash = {}

        for sku_id, count in sku_id_counts.items():
            redis_hash[int(sku_id)] = int(count)
        # 3.初始一个空的字典，这个字典用于存放合并中的hash数据  初始化两个空列表 一个接收选中额id，另一个接受未选中的id
        new_redis_hash={}
        selected_ids = []
        unselected_ids = []
        # 4.对cookie数据进行遍历
        # carts = {sku_id:{ count:xxx,selected:xxx}}
        for sku_id,count_seleted_dict in carts.items():

            # 5.判断cookie的数据是否存在redis中
            if sku_id in redis_hash:
                new_redis_hash[sku_id]= count_seleted_dict['count']

             # 6.把未选中、选中的数据添加到列表中
            else:
                new_redis_hash[sku_id] = count_seleted_dict['count']

            if count_seleted_dict['selected']:
                selected_ids.append(sku_id)
            else:
                unselected_ids.append(sku_id)


        # 7.将数据更新到redis中
        if len(carts)>0:
            redis_conn.hmset('carts_%s'%user.id,new_redis_hash)
        # selected_ids 选中的id进行添加
        if len(selected_ids)>0:
            # *selected_ids 是进行了解包操作
            redis_conn.sadd('selected_%s'%user.id,*selected_ids)
        # unselected_ids 未选中的id进行删除
        if len(unselected_ids)>0:
            redis_conn.srem('selected_%s'%user.id,*unselected_ids)

        # 8.合并之后应该将cookie数据进行删除
        response.delete_cookie('carts')
    return response






